home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_unix / j109lxa4.tar / fingerd.c < prev    next >
C/C++ Source or Header  |  1994-06-04  |  4KB  |  156 lines

  1. /* Internet Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "files.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "session.h"
  9. #include "proc.h"
  10. #include "dirutil.h"
  11. #include "commands.h"
  12. #include "mailbox.h"
  13.  
  14. extern int doipheard(int,char *,void *);
  15. extern int Sconv;
  16.  
  17. static int Sfinger = -1;    /* Prototype socket for service */
  18. static void fingerd __ARGS((int s,void *unused,void *p));
  19.  
  20. /* Start up finger service */
  21. int
  22. finstart(argc,argv,p)
  23. int argc;
  24. char *argv[];
  25. void *p;
  26. {
  27.     struct sockaddr_in lsocket;
  28.     int s;
  29.  
  30.     if(Sfinger != -1){
  31.         return 0;
  32.     }
  33.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  34.     chname(Curproc,"Finger listener");
  35.  
  36.     lsocket.sin_family = AF_INET;
  37.     lsocket.sin_addr.s_addr = INADDR_ANY;
  38.     if(argc < 2)
  39.         lsocket.sin_port = IPPORT_FINGER;
  40.     else
  41.         lsocket.sin_port = atoi(argv[1]);
  42.  
  43.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  44.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  45.     listen(Sfinger,1);
  46.     for(;;){
  47.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  48.             break;    /* Service is shutting down */
  49.  
  50.         /* Spawn a server */
  51.         if(newproc("fingerd",1024,fingerd,s,NULL,NULL,0) == NULLPROC)
  52.             close_s(s);
  53.     }
  54.     return 0;
  55. }
  56.  
  57. #define FLINE 128
  58.  
  59. static void
  60. fingerd(s,unused,p)
  61. int s;
  62. void *unused;
  63. void *p;
  64. {
  65.     char user[80];
  66.     int ulen,found;
  67.     FILE *fp;
  68.     char *file,*cp;
  69.     char line[FLINE+1];
  70.     int outsave;
  71. #ifdef USERLOG
  72.     char *newargv[2];
  73. #endif
  74.  
  75.     sockmode(s,SOCK_ASCII);
  76.     sockowner(s,Curproc);
  77.     log(s,"open Finger");
  78.     recvline(s,user,80);
  79.     rip(user);
  80.     ulen = strlen(user);
  81.  
  82. #ifdef CONVERS
  83.     if(ulen && !strcmp(user,"conf"))
  84.         ShowConfUsers(s,0);
  85.     else if( ulen && !strcmp(user,"links"))
  86.         ShowConfLinks(s,1);
  87.     else
  88. #endif
  89.     if(ulen && !strcmp(user,"iheard")) {
  90.         outsave = Curproc->output;
  91.         Curproc->output = s;
  92.         doipheard(0,NULL,NULL);
  93.         Curproc->output = outsave;
  94.     } else {
  95.         if(ulen == 0){
  96.             fp = dir(Fdir,0);
  97.             if(fp == NULLFILE)
  98.                 usprintf(s,"No finger information available\n");
  99.             else
  100.                 usprintf(s,"Known users on this system:\n");
  101.         } else {
  102. #ifdef USERLOG
  103.             outsave = Curproc->output;
  104.             Curproc->output = s;
  105.             newargv[1] = user;
  106.             dombuserinfo(0,newargv,NULL);
  107.             Curproc->output = outsave;
  108. #endif
  109.             file = pathname(Fdir,user);
  110.             cp = pathname(Fdir,"");
  111.             /* Check for attempted security violation (e.g., somebody
  112.              * might be trying to finger "../ftpusers"!)
  113.              */
  114.             if(strncmp(file,cp,strlen(cp)) != 0){
  115.                 fp = NULLFILE;
  116.                 usprintf(s,"Invalid user name %s\n",user);
  117.             } else if((fp = fopen(file,READ_TEXT)) == NULLFILE) {
  118.                 /* Now search the finger database file for this user - WG7J */
  119.                 found = 0;
  120.                 if((fp = fopen(Fdbase,READ_TEXT)) != NULLFILE) {
  121.                     while(fgets(line,FLINE,fp) != NULLCHAR)
  122.                         if(!strncmp(line,user,(size_t)ulen)) {
  123.                             usprintf(s,"%s", line);
  124.                             found = 1;
  125.                             break;
  126.                         }
  127.                     fclose(fp);
  128.                     fp = NULLFILE;
  129.                 }
  130.                 if(!found)
  131.                     usprintf(s,"No user info for %s\n",user);
  132.             }
  133.             free(cp);
  134.             free(file);
  135.         }
  136.         if(fp != NULLFILE){
  137.             sendfile(fp,s,ASCII_TYPE,0);
  138.             fclose(fp);
  139.         }
  140.     }
  141.     if(ulen == 0 && Listusers != NULL)
  142.         (*Listusers)(s);
  143.     close_s(s);
  144.     log(s,"close Finger");
  145. }
  146. int
  147. fin0(argc,argv,p)
  148. int argc;
  149. char *argv[];
  150. void *p;
  151. {
  152.     close_s(Sfinger);
  153.     Sfinger = -1;
  154.     return 0;
  155. }
  156.